package com.itheima.ui;

import javax.swing.*;
import java.awt.*;
import java.io.DataOutputStream;
import java.net.Socket;

public class ChatEntryFrame extends JFrame {

    private JTextField nicknameField; // 用于存储昵称输入框的引用

    private Socket socket;      //用于记住当前客户端系统的Socket管道

    /**
     * 构造函数，初始化窗口。
     */
    public ChatEntryFrame() {
        super("局域网聊天室--进入界面"); // 设置窗口标题
        initializeComponents(); // 调用初始化组件的方法
    }

    /**
     * 初始化窗口中的所有组件。
     */
    private void initializeComponents() {
        // 使用GridBagLayout来精确控制组件的位置和大小
        JPanel mainPanel = new JPanel(new GridBagLayout());

        // 创建昵称标签
        JLabel nameLabel = new JLabel("昵称:");
        nicknameField = new JTextField(20); // 创建昵称输入框，设置列数为20

        Font font = new Font("Serif", Font.PLAIN, 16); // 设置更大的字体
        nameLabel.setFont(font); // 设置昵称标签的字体
        nicknameField.setFont(font); // 设置昵称输入框的字体

        // 创建按钮
        JButton enterButton = new JButton("进入"); // 创建“进入”按钮
        JButton cancelButton = new JButton("取消"); // 创建“取消”按钮

        // 设置按钮的字体大小
        Font buttonFont = new Font("Serif", Font.PLAIN, 16);
        enterButton.setFont(buttonFont); // 设置“进入”按钮的字体
        cancelButton.setFont(buttonFont); // 设置“取消”按钮的字体

        // 创建按钮面板
        JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 20, 0));
        buttonPanel.add(enterButton); // 向按钮面板中添加“进入”按钮
        buttonPanel.add(cancelButton); // 向按钮面板中添加“取消”按钮

        // 设置进入按钮的点击事件监听器
        enterButton.addActionListener(e -> {
            // 获取昵称输入框中的文本
            String nickname = nicknameField.getText();

            //清空输入框
            nicknameField.setText("");

            // 处理“进入”按钮的点击事件
            if (!nickname.isEmpty()) {

                try {
                    //调用底层的登录方法
                    enter(nickname);

                    //进入聊天界面：把昵称传过去
                    new ClientChatFrame(nickname, socket);
                } catch (Exception ex) {
                    ex.printStackTrace();
                }

                // 关闭当前窗口
                this.dispose();
            } else {
                // 显示提示信息
                JOptionPane.showMessageDialog(ChatEntryFrame.this, "请输入昵称！", "提示", JOptionPane.WARNING_MESSAGE);
            }


        });

        // 设置取消按钮的点击事件监听器
        cancelButton.addActionListener(e -> {
            // 处理“取消”按钮的点击事件
            this.dispose(); // 关闭当前窗口
        });

        // 设置GridBagConstraints属性
        GridBagConstraints gbc = new GridBagConstraints();

        gbc.gridx = 0; // 列索引
        gbc.gridy = 0; // 行索引
        gbc.anchor = GridBagConstraints.LINE_START; // 对齐方式
        gbc.insets = new Insets(10, 10, 10, 10); // 内边距设置

        // 添加昵称标签
        mainPanel.add(nameLabel, gbc); // 将昵称标签添加到主面板中

        // 调整输入框的大小
        gbc.gridx = 1;
        gbc.gridwidth = 1; // 占据一个单元格的宽度
        gbc.weightx = 1.0; // 水平扩展因子
        gbc.fill = GridBagConstraints.HORIZONTAL; // 填充模式为水平方向
        gbc.anchor = GridBagConstraints.LINE_START; // 对齐方式改为居中
        mainPanel.add(nicknameField, gbc); // 将昵称输入框添加到主面板中

        // 下一行添加按钮面板
        gbc.gridy = 1;
        gbc.gridwidth = 2; // 跨两列
        gbc.weightx = 1.0; // 水平扩展因子
        gbc.fill = GridBagConstraints.BOTH; // 填充模式为水平和垂直方向
        gbc.anchor = GridBagConstraints.CENTER; // 居中对齐
        mainPanel.add(buttonPanel, gbc); // 将按钮面板添加到主面板中

        // 设置关闭操作
        setBounds(100, 100, 400, 200); // 设置窗口初始位置和大小
        setDefaultCloseOperation(EXIT_ON_CLOSE); // 设置窗口关闭操作

        // 将主面板添加到frame中
        add(mainPanel, BorderLayout.CENTER); // 将主面板添加到框架的中心区域

        // 调整窗口大小
        pack(); // 自动调整窗口大小以适应其内容

        // 设置窗口的最小尺寸
        setMinimumSize(new Dimension(300, 200)); // 设置窗口的最小尺寸

        // 让窗口居中显示
        setLocationRelativeTo(null); // 将窗口居中显示

        // 显示窗口
        setVisible(true);
    }

    private void enter(String nickname) throws Exception {     //底层异常往外抛
        //立即发送登录消息给服务端
        //1.创建Socket管道请求与服务端建立联系
        socket = new Socket(Constant.SERVER_IP, Constant.SERVER_PORT);
        //2.发送登录消息（消息类型1和昵称）
        DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
        dos.writeInt(1);
        dos.writeUTF(nickname);
        dos.flush();
    }

    /**
     * 获取昵称输入框中的文本。
     * @return 输入的昵称
     */
    public String getNickname() {
        return nicknameField.getText(); // 返回昵称输入框中的文本
    }


   /* public static void main(String[] args) {
        new ChatEntryFrame();
    }*/
}